package com.hk.shop.base.dao;

import java.io.Serializable;
import java.util.List;

import javax.persistence.LockModeType;

import com.hk.shop.page.Page;
import com.hk.shop.page.PageFilter;
import com.hk.shop.page.PageInfo;

/**
 * @ClassName BaseDao
 * @author Harking
 * @date Mar 23, 2017 2:45:18 PM
 * @version 1.0
 */
public interface BaseDao<T, ID extends Serializable> {

	/**
	 * 插入对象
	 * 
	 * @param t
	 * @return
	 */
	T insert(T t);

	/**
	 * 删除对象
	 * 
	 * @param t
	 */
	void delete(T t);

	/**
	 * 更新对象
	 * 
	 * @param t
	 */
	void update(T t);

	/**
	 * 获取查找对象
	 * 
	 * @param id
	 * @return
	 */
	T get(ID id);

	/**
	 * 根据hql查找唯一结果
	 * 
	 * @param hql
	 * @param args
	 * @return
	 */
	T getUnique(String hql, Object[] args);

	/**
	 * 保存对象(更新或插入)
	 * 
	 * @param t
	 * @return
	 */
	T save(T t);

	/**
	 * 加载对象
	 * 
	 * @param id
	 * @return
	 */
	T load(long id);

	/**
	 * 加载对象 @param id @return @throws
	 */
	T saveOrUpdate(T t);

	/**
	 * 查找实体对象
	 * 
	 * @param id
	 *            ID
	 * @return 实体对象，若不存在则返回null
	 */
	T find(ID id);

	/**
	 * 查找实体对象
	 * 
	 * @param id
	 *            ID
	 * @return 实体对象，若不存在则返回null
	 */
	T findUniqueByProperty(final String propertyName, final Object value);

	/**
	 * 查找实体对象
	 * 
	 * @param id
	 *            ID
	 * @param lockModeType
	 *            锁定方式
	 * @return 实体对象，若不存在则返回null
	 */
	T find(ID id, LockModeType lockModeType);

	/**
	 * 查找所有的
	 * 
	 * @return @
	 */
	List<T> findAll();

	/**
	 * 根据sql和查询参数查找list
	 * 
	 * @param hql
	 * @param args
	 * @return @
	 */
	List<T> query(String hql, Object[] args);

	/**
	 * 查找实体对象分页
	 * 
	 * @param pageable
	 *            分页信息
	 * @return 实体对象分页
	 */
	Page<T> findPage(PageInfo pageInfo);

	/**
	 * 根据hql查找实体对象分页
	 * 
	 * @param pageInfo
	 * @param hql
	 * @return
	 */
	Page<T> findPage(PageInfo pageInfo, String hql);

	/**
	 * 根据条件获取总数量
	 * 
	 * @param pageInfo
	 * @return Long
	 */
	Long queryTotalNum(PageInfo pageInfo);

	/**
	 * 查找实体对象集合
	 * 
	 * @param first
	 *            起始记录
	 * @param count
	 *            数量
	 * @param filters
	 *            筛选
	 * @param orders
	 *            排序
	 * @return 实体对象集合
	 */
	// List<T> findList(Integer first, Integer count, List<Filter> filters,
	// List<Order> orders);

	/**
	 * 查询实体对象数量
	 * 
	 * @param filters
	 *            筛选
	 * @return 实体对象数量
	 */
	// long count(Filter... filters);

	/**
	 * 持久化实体对象
	 * 
	 * @param entity
	 *            实体对象
	 */
	void persist(T entity);

	/**
	 * 合并实体对象
	 * 
	 * @param entity
	 *            实体对象
	 * @return 实体对象
	 */
	T merge(T entity);

	/**
	 * 移除实体对象
	 * 
	 * @param entity
	 *            实体对象
	 */
	void remove(T entity);

	/**
	 * 刷新实体对象
	 * 
	 * @param entity
	 *            实体对象
	 */
	void refresh(T entity);

	/**
	 * 刷新实体对象
	 * 
	 * @param entity
	 *            实体对象
	 * @param lockModeType
	 *            锁定方式
	 */
	void refresh(T entity, LockModeType lockModeType);

	/**
	 * 获取实体对象ID
	 * 
	 * @param entity
	 *            实体对象
	 * @return 实体对象ID
	 */
	ID getIdentifier(T entity);

	/**
	 * 判断是否为托管状态
	 * 
	 * @param entity
	 *            实体对象
	 * @return 是否为托管状态
	 */
	boolean isManaged(T entity);

	/**
	 * 设置为游离状态
	 * 
	 * @param entity
	 *            实体对象
	 */
	void detach(T entity);

	/**
	 * 锁定实体对象
	 * 
	 * @param entity
	 *            实体对象
	 * @param lockModeType
	 *            锁定方式
	 */
	void lock(T entity, LockModeType lockModeType);

	/**
	 * 清除缓存
	 */
	void clear();

	/**
	 * 同步数据
	 */
	void flush();

	/**
	 * 有返回参数的存储过程实现方法
	 * 
	 * @MethodName callProcdureNoReturn
	 * @returnType void
	 * @author Harking
	 * @date Mar 24, 20174:17:25 PM
	 * @version 1.0
	 */
	String callProcedureWithReturn(String callSql, Object... inParameters);

	/**
	 * 没有返回参数的存储过程实现方法
	 * 
	 * @MethodName callProcdureNoReturn
	 * @returnType void
	 * @author Harking
	 * @date Mar 24, 20174:17:25 PM
	 * @version 1.0
	 */
	void callProcedureNoReturn(String callSql, Object[] params);

	/**
	 * 获取查询总数
	 * 
	 * @param filters
	 * @return @
	 */
	long count(PageFilter... filters);

	long count(String hql,Object[] params);

}